home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / MacOberonLite 1.0.1 / Samples / SampleApp.Mod < prev    next >
Encoding:
Text File  |  1993-12-11  |  19.2 KB  |  631 lines  |  [TEXT/ObLi]

  1. MODULE SampleApp;    (* Sample Macintosh Application mf/od*)
  2.  
  3. (* This Sample Text Editor shows how to use MacOberon to develop a standalone Mac Application.
  4.     Some parts are taken from the new Inside Mac Toolbox Essentiels, so you have to lookup
  5.     there, if you have some specific questions about the code.
  6.     This application does NOT show how you SHOULD program to Mac, it's only intended as
  7.     a sample for the use of MacOberon!
  8.     Because we use the MacOberon Compiler, this application needs also at least an 68020 processor.
  9.     
  10.     Click the following commands to compile, link and launch the application:
  11.  
  12.     Compiler.Compile SampleApp.Mod~
  13.     MApplLinker.Link SampleApp ~
  14.     MApplLinker.Launch SampleApp
  15.  
  16.     Read MakeMacApp.Doc for more information about how to create Macintosh standalone
  17.     applications using MacOberon. ( Write.Open MakeMacApp.Doc )
  18. *)
  19.  
  20. IMPORT
  21.     SYSTEM, TB:= MacToolbox,ME:=MacMemory,TE:=MacText,IM:=MacImaging,MF:=MacFiles,
  22.     MP:=MacProcesses,MT:=MacMoreToolbox,MO:=MacOSUtils;
  23.  
  24. CONST
  25.     (* Apple Menu *)    
  26.         mApple=256; 
  27.         iAbout=1;
  28.     (* File Menu *)
  29.         mFile=257; 
  30.         iNew=1;
  31.         iOpen=2;
  32.         iClose=3;
  33.         iSave=5;
  34.         iPageSetUp=7;
  35.         iPrint=8;
  36.         iQuit=10;
  37.     (* Edit Menu *)
  38.         mEdit=258;
  39.         iCut=3;
  40.         iCopy=4;
  41.         iPaste=5;
  42.         iClear=6;
  43.         iSelectAll=8;
  44.     (* Font Menus *)
  45.         mFont=259;
  46.         mSize=260;
  47.     (* Alerts *)
  48.         aAbout=1000;
  49.     (* Controls *)
  50.         rVScroll=128;
  51.  
  52. TYPE
  53.     DocRec = RECORD        (* Datatype for our documents *)
  54.         data : TE.TEHandle;
  55.         vScrollBar : TB.ControlHandle;
  56.     END;
  57.     DocPtr = POINTER- TO DocRec;
  58.  
  59. VAR
  60.     wcount: SHORTINT;    (* Application Window Number *)
  61.     gPrint : IM.THPrint;    (* global Printhandle *)
  62.     
  63. (***************************************************************)
  64. (* Two general routines for adjusting rectangles of the textwindows *)
  65.  
  66.     PROCEDURE GetTERect(window : TB.WindowPtr; VAR teRect : IM.Rect);
  67.     BEGIN
  68.         teRect:=window.portRect;
  69.         IM.InsetRect(teRect, 4 ,4 );
  70.         DEC(teRect.right, 15);
  71.         DEC(teRect.bottom, 15);
  72.     END GetTERect;
  73.  
  74.     PROCEDURE AdjustViewRect(docTE : TE.TEHandle);
  75.     BEGIN
  76.         docTE.p.viewRect.bottom:=(((docTE.p.viewRect.bottom-docTE.p.viewRect.top) DIV docTE.p.lineHeight) *
  77.             docTE.p.lineHeight) + docTE.p.viewRect.top;
  78.     END AdjustViewRect;
  79.  
  80. (***************************************************************)
  81. (* Creates and returns a new TextEdit window *)
  82.  
  83.     PROCEDURE NewWindow() : TB.WindowPtr;
  84.     VAR 
  85.         winTitle: ME.Str255;
  86.         wbounds, tbounds: IM.Rect;
  87.         window: TB.WindowPtr;
  88.         text: TE.TEHandle;
  89.         newDoc : DocPtr;
  90.         info : TE.FontInfo;
  91.     BEGIN    
  92.         wbounds.top:=IM.QuickDraw.screenBits.bounds.top+40+10*(wcount MOD 10);    (* Open new window *)
  93.         wbounds.left:=IM.QuickDraw.screenBits.bounds.left+20+10*(wcount MOD 10);
  94.         wbounds.bottom:=IM.QuickDraw.screenBits.bounds.bottom-20;
  95.         wbounds.right:=IM.QuickDraw.screenBits.bounds.right-50; INC(wcount);
  96.         winTitle[0]:=3X; winTitle[1]:=23X; winTitle[2]:=CHR((wcount DIV 10) MOD 10+30H); winTitle[3]:=CHR(wcount MOD 10+30H);
  97.         window:=TB.NewWindow(NIL, wbounds, winTitle, FALSE, 0, SYSTEM.VAL(TB.WindowPtr, -1), TRUE, 0);
  98.         IM.SetPort(window);
  99.         GetTERect(window, tbounds);
  100.         text:=TE.TENew(tbounds, tbounds);    (* Add textedit structure and set default font *)
  101.         text.p.txFont:=4;text.p.txSize:=9;
  102.         TE.TextFont(4);TE.TextSize(9);
  103.         TE.GetFontInfo(info);
  104.         text.p.lineHeight:=info.ascent+info.descent+info.leading;
  105.         text.p.fontAscent:=info.ascent;
  106.         AdjustViewRect(text);
  107.         TE.TEAutoView(TRUE, text);        
  108.         SYSTEM.PUTREG(0,LONG(LONG(SIZE(DocRec))));    (* use two LONG to prevent from a MOVE.B instruction *)
  109.         ME.NewPtrClear;
  110.         SYSTEM.GETREG(8, newDoc);
  111.         newDoc.data:=text;
  112.         newDoc.vScrollBar:=TB.GetNewControl(rVScroll, window);    (* Add scrollbar *)
  113.         window.refCon:=SYSTEM.VAL(LONGINT, newDoc);    (* We use the window refcon to store our data pointer *)
  114.         RETURN window
  115.     END NewWindow;
  116.  
  117. (***************************************************************)
  118. (* Routines for text scrolling and updating *)
  119.     
  120.     PROCEDURE AdjustTE(window : TB.WindowPtr);
  121.     VAR
  122.         myDoc : DocPtr;
  123.     BEGIN
  124.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  125.         TE.TEPinScroll((myDoc.data.p.viewRect.left-myDoc.data.p.destRect.left),
  126.             (myDoc.data.p.viewRect.top-myDoc.data.p.destRect.top)-(TB.GetCtlValue(myDoc.vScrollBar)*myDoc.data.p.lineHeight),
  127.             myDoc.data);
  128.     END AdjustTE;
  129.         
  130.     PROCEDURE AdjustScrollSizes(window : TB.WindowPtr);
  131.     VAR
  132.         myDoc : DocPtr;
  133.         teTop, teRight, teBottom : INTEGER;
  134.         teRect : IM.Rect;
  135.     BEGIN
  136.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  137.         GetTERect(window, teRect);
  138.         teTop:=window.portRect.top;
  139.         teRight:=window.portRect.right;
  140.         teBottom:=window.portRect.bottom;
  141.         myDoc.data.p.viewRect:=teRect;
  142.         AdjustViewRect(myDoc.data);
  143.         TB.MoveControl(myDoc.vScrollBar, teRight-15, -1);
  144.         TB.SizeControl(myDoc.vScrollBar, 16, (teBottom-teTop)-13);
  145.     END AdjustScrollSizes;
  146.  
  147.     PROCEDURE AdjustScrollValues(window : TB.WindowPtr);
  148.     VAR 
  149.         myDoc : DocPtr;
  150.         max, lines, value : INTEGER;
  151.     BEGIN
  152.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  153.         lines:=myDoc.data.p.nLines;
  154.         max:=lines-((myDoc.data.p.viewRect.bottom-myDoc.data.p.viewRect.top) DIV myDoc.data.p.lineHeight);
  155.         IF max<0 THEN max:=0 END;
  156.         TB.SetCtlMax(myDoc.vScrollBar, max);
  157.         value:=(myDoc.data.p.viewRect.top-myDoc.data.p.destRect.top) DIV myDoc.data.p.lineHeight;
  158.         IF value<0 THEN value:=0 END;IF value>max THEN value:=max END;
  159.         TB.SetCtlValue(myDoc.vScrollBar, value);
  160.         TB.ShowControl(myDoc.vScrollBar)
  161.     END AdjustScrollValues;
  162.  
  163.     PROCEDURE AdjustScrollBars(window : TB.WindowPtr; resize : BOOLEAN);
  164.     VAR 
  165.         myDoc : DocPtr;
  166.     BEGIN
  167.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  168.         myDoc.vScrollBar.p.contrlVis:=0;
  169.         IF resize THEN AdjustScrollSizes(window) END;
  170.         AdjustScrollValues(window)
  171.     END AdjustScrollBars;
  172.  
  173. (***************************************************************)
  174. (* Use StandardGetFile to select and open a plain ascii text file *)
  175.  
  176.     PROCEDURE OpenFile;
  177.     VAR
  178.         myTypes : MF.SFTypeList;
  179.         myReply : MF.StandardFileReply;
  180.         window : TB.WindowPtr;
  181.         inFile : INTEGER;
  182.         err : INTEGER;
  183.         theSize : LONGINT;
  184.         buffer : ME.Ptr;
  185.         myDoc : DocPtr;
  186.     BEGIN
  187.         myTypes[0]:=054455854H;    (* TEXT *)
  188.         MF.StandardGetFile(NIL, 1, myTypes, myReply);
  189.         IF myReply.sfGood THEN
  190.             window:=NewWindow();
  191.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  192.             TB.SetWTitle(window, SYSTEM.VAL(ME.Str255, myReply.sfFile.name));
  193.             err:=MF.FSpOpenDF(myReply.sfFile, 0, inFile);
  194.             err:=MF.GetEOF(inFile, theSize);
  195.             IF theSize>7FFFH THEN theSize:=7FFFH END;    (* Limitation of TextEdit, max 32768 chars *)
  196.             err:=MF.SetFPos(inFile, 1, 0);
  197.             SYSTEM.PUTREG(0, 8000H);
  198.             ME.NewPtr;
  199.             SYSTEM.GETREG(8, buffer);
  200.             err:=MF.FSRead(inFile, theSize, buffer);
  201.             err:=MF.FSClose(inFile);
  202.             TE.TESetText(buffer, theSize, myDoc.data);
  203.             AdjustScrollBars(window, TRUE);
  204.             AdjustTE(window);
  205.             TB.ShowWindow(window);
  206.             SYSTEM.PUTREG(8, buffer);
  207.             ME.DisposePtr
  208.         END;
  209.     END OpenFile;
  210.  
  211. (***************************************************************)
  212. (* Close the front window *)
  213.  
  214.     PROCEDURE CloseWindow;
  215.     VAR
  216.         window : TB.WindowPtr;
  217.         myDoc : DocPtr;
  218.     BEGIN
  219.         window:=TB.FrontWindow();
  220.         IF window=NIL THEN RETURN END;
  221.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  222.         TE.TEDispose(myDoc.data);
  223.         TB.CloseWindow(window);
  224.         SYSTEM.PUTREG(8, myDoc);
  225.         ME.DisposePtr;
  226.     END CloseWindow;
  227.  
  228. (***************************************************************)
  229. (* Save the content of the front window to a file *)
  230.  
  231.     PROCEDURE SaveWindow;
  232.     VAR
  233.         myReply : MF.StandardFileReply;
  234.         prompt, defname : ME.Str255;
  235.         myDoc : DocPtr;
  236.         window : TB.WindowPtr;
  237.         myFile : INTEGER;
  238.         err : INTEGER;
  239.         size : LONGINT;
  240.     BEGIN
  241.         window:=TB.FrontWindow();
  242.         IF window=NIL THEN RETURN END;
  243.         TB.SetStr255(prompt, 'Save file as :');
  244.         TB.SetStr255(defname, 'Untitled');
  245.         MF.StandardPutFile(prompt, defname, myReply);    (* Select a filename *)
  246.         IF myReply.sfGood THEN
  247.             IF myReply.sfReplacing THEN err:=MF.FSpDelete(myReply.sfFile) END;
  248.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  249.             err:=MF.FSpCreate(myReply.sfFile, 045444954H, 054455854H, 0);    (* Create a new file *)
  250.             err:=MF.FSpOpenDF(myReply.sfFile, 0, myFile);
  251.             IF err=0 THEN
  252.                 size:=myDoc.data.p.teLength;
  253.                 err:=MF.FSWrite(myFile, size, myDoc.data.p.hText.p);    (* Write the text data *)
  254.                 err:=MF.FSClose(myFile)
  255.             END
  256.         END
  257.     END SaveWindow;
  258.  
  259. (***************************************************************)
  260. (* Print the content of the front window *)
  261.  
  262.     PROCEDURE DoPageSetUp;
  263.     VAR 
  264.         ignore : BOOLEAN;
  265.     BEGIN
  266.         IM.PrOpen;
  267.         ignore:=IM.PrStlDialog(gPrint);    (* Get Pagesetup *)
  268.         IM.PrClose
  269.     END DoPageSetUp;
  270.  
  271.     PROCEDURE DoPrint;
  272.     VAR
  273.         myDoc : DocPtr;
  274.         window : TB.WindowPtr;
  275.         pages : INTEGER;
  276.         lines : INTEGER;
  277.         prPort : IM.GrafPtr;
  278.         line,page : INTEGER;
  279.         lh,y : INTEGER;
  280.     BEGIN
  281.         window:=TB.FrontWindow();
  282.         IF window=NIL THEN RETURN END;
  283.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  284.         IM.PrOpen;
  285.         IF IM.PrJobDialog(gPrint) THEN    (* Get printing options *)
  286.             prPort:=IM.PrOpenDoc(gPrint, NIL, 0);
  287.             lines:= (prPort.portRect.bottom - prPort.portRect.top) DIV myDoc.data.p.lineHeight;
  288.             pages:= myDoc.data.p.nLines DIV lines;
  289.             line:=0;page:=0;
  290.             WHILE page<=pages DO
  291.                 IM.PrOpenPage(prPort, NIL);
  292.                 TE.TextFont(myDoc.data.p.txFont);
  293.                 TE.TextSize(myDoc.data.p.txSize);
  294.                 lh:=myDoc.data.p.lineHeight;
  295.                 y:=lh;
  296.                 REPEAT
  297.                     IM.MoveTo(20,y);
  298.                     TE.DrawText(myDoc.data.p.hText.p, myDoc.data.p.lineStarts[line], myDoc.data.p.lineStarts[line+1]-
  299.                         myDoc.data.p.lineStarts[line]-1);
  300.                     INC(line);
  301.                     INC(y,lh);
  302.                 UNTIL ((line>myDoc.data.p.nLines)OR((line MOD lines)=0));
  303.                 IM.PrClosePage(prPort);
  304.                 INC(page);
  305.             END;
  306.             IM.PrCloseDoc(prPort);
  307.         END;
  308.         IM.PrClose
  309.     END DoPrint;
  310.  
  311. (***************************************************************)
  312. (* Clickroutine for scrollbar *)
  313.  
  314.     PROCEDURE VertAction(control : TB.ControlHandle; part : INTEGER);
  315.     VAR
  316.         scrollDistance:INTEGER;
  317.         window : TB.WindowPtr;
  318.         myDoc : DocPtr;
  319.         oldSetting,max : INTEGER;
  320.     BEGIN
  321.         IF part#0 THEN
  322.             window:=control.p.contrlOwner;
  323.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  324.             CASE part OF
  325.             |    TB.inUpButton,TB.inDownButton : scrollDistance:=1
  326.             |    TB.inPageUp,TB.inPageDown : scrollDistance:=10
  327.             END;
  328.             IF (part=TB.inDownButton) OR (part=TB.inPageDown) THEN scrollDistance:=-scrollDistance END;
  329.             oldSetting:=TB.GetCtlValue(control);
  330.             max:=TB.GetCtlMax(control);
  331.             scrollDistance:=oldSetting-scrollDistance;
  332.             IF scrollDistance<0 THEN scrollDistance:=0 END;IF scrollDistance>max THEN scrollDistance:=max END;
  333.             TB.SetCtlValue(control,scrollDistance);
  334.             scrollDistance:=oldSetting-scrollDistance;
  335.             IF scrollDistance#0 THEN TE.TEPinScroll(0, scrollDistance*myDoc.data.p.lineHeight, myDoc.data) END;
  336.         END;
  337.     END VertAction;
  338.  
  339. (***************************************************************)
  340. (* Process the clicking into a text window *)
  341.  
  342.     PROCEDURE DoContentClick(window : TB.WindowPtr; event : TB.EventRecord);
  343.     VAR
  344.         control : TB.ControlHandle;
  345.         value,part : INTEGER;
  346.         myDoc : DocPtr;
  347.         teRect : IM.Rect;
  348.     BEGIN
  349.         IM.SetPort(window);
  350.         IM.GlobalToLocal(event.where);
  351.         GetTERect(window, teRect);
  352.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  353.         IF ~IM.PtInRect(event.where,teRect) THEN    (* Click into scrollbar? *)
  354.             part:=TB.FindControl(event.where, window, control);
  355.             CASE part OF
  356.             |    0 :
  357.             |    TB.inThumb : 
  358.                 value:=TB.GetCtlValue(control);
  359.                 part:=TB.TrackControl(control, event.where, NIL);
  360.                 IF part#0 THEN
  361.                     value:=value - TB.GetCtlValue(control);
  362.                     IF value#0 THEN TE.TEPinScroll(0, value*myDoc.data.p.lineHeight, myDoc.data) END
  363.                 END
  364.             ELSE 
  365.                 part:=TB.TrackControl(control, event.where, VertAction)
  366.             END
  367.         ELSE TE.TEClick(event.where, FALSE, myDoc.data) END    (* Click into window *)
  368.     END DoContentClick;
  369.  
  370. (***************************************************************)
  371. (* Process the selecting of a menuitem *)
  372.  
  373.     PROCEDURE MenuCommand(menuResult: LONGINT);    (* Item has been Chosen by MenuSelect or MenuKey *)
  374.     VAR 
  375.         menu, item: INTEGER;
  376.         Name: ME.Str255;
  377.         daRefNum: INTEGER; 
  378.         itemHit: INTEGER; 
  379.         window: TB.WindowPtr;
  380.         myDoc:DocPtr; 
  381.         fontID, fsize : INTEGER; 
  382.         fInfo : TE.FontInfo; 
  383.         oldPort : IM.GrafPtr;
  384.     BEGIN    
  385.         menu:=SHORT(menuResult DIV 10000H); item:=SHORT(menuResult MOD 10000H);   (* Get menu and item number *)
  386.         window:=TB.FrontWindow();
  387.         IF window#NIL THEN myDoc:=SYSTEM.VAL(DocPtr, window.refCon) END;
  388.         CASE    menu    OF
  389.         |    mApple:
  390.                     IF item=iAbout THEN itemHit:=TB.Alert(aAbout, NIL) ELSE
  391.                         TB.GetItem(TB.GetMHandle(mApple), item, Name); daRefNum:=TB.OpenDeskAcc(Name)
  392.                     END
  393.         |    mFile:
  394.                     CASE item OF
  395.                     |    iNew : window:=NewWindow();AdjustScrollBars(window, TRUE);TB.ShowWindow(window)
  396.                     |    iOpen : OpenFile;
  397.                     |    iClose : CloseWindow;
  398.                     |    iPageSetUp : DoPageSetUp;
  399.                     |    iPrint : DoPrint;
  400.                     |    iSave : SaveWindow;
  401.                     |    iQuit : MP.ExitToShell 
  402.                     ELSE END
  403.         |    mEdit:
  404.                     IF window#NIL THEN
  405.                         CASE item OF    (* We don't exchange our data with the clipboard *)
  406.                         |    iCut : TE.TECut(myDoc.data);
  407.                         |    iCopy : TE.TECopy(myDoc.data);
  408.                         |    iPaste : TE.TEPaste(myDoc.data);
  409.                         |    iClear : TE.TEDelete(myDoc.data);
  410.                         |    iSelectAll : TE.TESetSelect(0, 32767, myDoc.data)
  411.                         ELSE END;
  412.                         AdjustScrollBars(window, FALSE)
  413.                     END
  414.         |    mFont:
  415.                     IF window#NIL THEN
  416.                         TB.GetItem(TB.GetMHandle(mFont), item, Name);
  417.                         TE.GetFNum(Name, fontID);
  418.                         IM.GetPort(oldPort);
  419.                         IM.SetPort(myDoc.data.p.inPort);
  420.                         TE.TextFont(fontID);
  421.                         myDoc.data.p.txFont:=fontID;
  422.                         AdjustScrollBars(window, TRUE);
  423.                         AdjustTE(window);
  424.                         TB.InvalRect(window.portRect);
  425.                         IM.SetPort(oldPort)
  426.                     END
  427.         |    mSize:
  428.                     IF window#NIL THEN
  429.                         CASE item OF
  430.                         |    1 : fsize:=9;
  431.                         |    2 : fsize:=10;
  432.                         |    3 : fsize:=12;
  433.                         |    4 : fsize:=18;
  434.                         |    5 : fsize:=24
  435.                         ELSE END;
  436.                         IM.GetPort(oldPort);
  437.                         IM.SetPort(myDoc.data.p.inPort);
  438.                         TE.TextSize(fsize);
  439.                         myDoc.data.p.txSize:=fsize;
  440.                         TE.GetFontInfo(fInfo);
  441.                         myDoc.data.p.lineHeight:=fInfo.ascent+fInfo.descent+fInfo.leading;
  442.                         myDoc.data.p.fontAscent:=fInfo.ascent;
  443.                         AdjustScrollBars(window, TRUE);
  444.                         AdjustTE(window);
  445.                         TB.InvalRect(window.portRect);
  446.                         IM.SetPort(oldPort)
  447.                     END
  448.         ELSE END;
  449.         TB.HiliteMenu(0)
  450.     END MenuCommand;
  451.  
  452. (***************************************************************)
  453. (* Help routine for update *)
  454.  
  455.     PROCEDURE GetLocalUpdateRgn(window : TB.WindowPtr; localRgn : IM.RgnHandle);
  456.     BEGIN
  457.         IM.CopyRgn(window.updateRgn, localRgn);
  458.         IM.OffsetRgn(localRgn, window.portBits.bounds.left, window.portBits.bounds.top)
  459.     END GetLocalUpdateRgn;
  460.  
  461. (***************************************************************)
  462. (* Handle activating or deactivating of a text window  *)
  463.  
  464.     PROCEDURE DoActivate(window : TB.WindowPtr; active : BOOLEAN);
  465.     VAR
  466.         myDoc : DocPtr;
  467.         growRect : IM.Rect;
  468.     BEGIN
  469.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  470.         IF active THEN
  471.             TE.TEActivate(myDoc.data);
  472.             myDoc.vScrollBar.p.contrlVis:=-1;
  473.             TB.InvalRect(myDoc.vScrollBar.p.contrlRect);
  474.             growRect:=window.portRect;
  475.             growRect.left:=growRect.right-15;
  476.             growRect.top:=growRect.bottom-15;
  477.             TB.InvalRect(growRect);
  478.         ELSE
  479.             TE.TEDeactivate(myDoc.data);
  480.             TB.HideControl(myDoc.vScrollBar);
  481.             TB.DrawGrowIcon(window)
  482.         END
  483.     END DoActivate;
  484.  
  485. (***************************************************************)
  486. (* Main loop of our program - handles all incoming events *)
  487.  
  488.     PROCEDURE Loop();
  489.     VAR 
  490.         gotEvent: BOOLEAN;
  491.         event: TB.EventRecord; 
  492.         window: TB.WindowPtr;
  493.         key: INTEGER;
  494.         newsize : LONGINT;
  495.         myDoc : DocPtr;
  496.         growRect, oldViewRect : IM.Rect;
  497.         locUpdateRgn : IM.RgnHandle;
  498.         theResult : BOOLEAN;
  499.     BEGIN
  500.         LOOP    gotEvent:=TB.WaitNextEvent(TB.everyEvent, event, 0, NIL);
  501.             CASE    event.what    OF
  502.             |    TB.mouseDown:
  503.                         CASE    TB.FindWindow(event.where, window)    OF
  504.                         |    TB.inMenuBar:    MenuCommand(TB.MenuSelect(event.where))
  505.                         |    TB.inSysWindow:    TB.SystemClick(event, window)
  506.                         |    TB.inContent:
  507.                                     IF    window # TB.FrontWindow()    THEN TB.SelectWindow(window)
  508.                                     ELSE DoContentClick(window, event)
  509.                                     END
  510.                         |    TB.inDrag:    TB.DragWindow(window, event.where, IM.QuickDraw.screenBits.bounds)
  511.                         |    TB.inGoAway:    IF TB.TrackGoAway(window, event.where) THEN TB.CloseWindow(window) END
  512.                         |    TB.inGrow: 
  513.                                     IM.SetPort(window);
  514.                                     IM.SetRect(growRect, 64, 64, 2000, 2000);
  515.                                     newsize:=TB.GrowWindow(window, event.where, growRect);
  516.                                     IF newsize#0 THEN
  517.                                         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  518.                                         oldViewRect:=myDoc.data.p.viewRect;
  519.                                         locUpdateRgn:=IM.NewRgn();
  520.                                         GetLocalUpdateRgn(window, locUpdateRgn);
  521.                                         TB.SizeWindow(window, SHORT(newsize MOD 10000H), SHORT(newsize DIV 10000H),TRUE);
  522.  
  523.                                         AdjustScrollBars(window, TRUE);
  524.                                         AdjustTE(window);
  525.                                         TB.InvalRect(window.portRect);
  526.  
  527.                                         theResult:=IM.SectRect(oldViewRect, myDoc.data.p.viewRect, oldViewRect);
  528.                                         TB.ValidRect(oldViewRect);
  529.                                         TB.InvalRgn(locUpdateRgn);
  530.                                         IM.DisposeRgn(locUpdateRgn);
  531.                                     END;
  532.                         |    TB.inDesk, TB.inZoomIn, TB.inZoomOut:
  533.                         END;
  534.     
  535.             |    TB.keyDown,TB.autoKey:    (* check if cmdkey is pressed *)
  536.                         key:=SHORT(event.message MOD 100H);
  537.                         IF    8 IN SYSTEM.VAL(SET, LONG(event.modifiers))    THEN    MenuCommand(TB.MenuKey(key))
  538.                         ELSE
  539.                             window:=TB.FrontWindow();
  540.                             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  541.                             TE.TEKey(key, myDoc.data);    (* Enter key in text *)
  542.                             AdjustScrollBars(window, FALSE)
  543.                         END
  544.  
  545.             |    TB.updateEvt:
  546.                         window:=SYSTEM.VAL(TB.WindowPtr, event.message);
  547.                         IF window#NIL THEN
  548.                             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  549.                             TB.BeginUpdate(window);
  550.                                 IM.SetPort(window);
  551.                                 IM.EraseRect(window.portRect);
  552.                                 TB.DrawControls(window);
  553.                                 TB.DrawGrowIcon(window);
  554.                                 TE.TEUpdate(window.portRect, myDoc.data);
  555.                             TB.EndUpdate(window)
  556.                         END;
  557.  
  558.             |    TB.activateEvt:    (* modifiers: bit0:  0=deactivate 1=activate *)
  559.                         window:=SYSTEM.VAL(TB.WindowPtr, event.message);
  560.                         IF window#NIL THEN DoActivate(window, ODD(event.modifiers)) END;
  561.  
  562.             |    TB.osEvt:
  563.                         window:=TB.FrontWindow();
  564.                         IF    window#NIL    THEN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  565.                             IF    SYSTEM.LSH(event.message, -24) (*MOD 100H*)=TB.suspendResumeMessage    THEN
  566.                                 IF    ODD(event.message)    THEN    (* Activate *)
  567.                                     IM.SetPort(window); TE.TEActivate(myDoc.data); IM.InitCursor
  568.                                 ELSE    (* Deactivate *)
  569.                                     TE.TEDeactivate(myDoc.data); IM.InitCursor
  570.                                 END
  571.                             END
  572.                         ELSE IM.InitCursor END
  573.  
  574.             |    TB.nullEvent:
  575.                     window:=TB.FrontWindow();
  576.                     IF window#NIL THEN
  577.                         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  578.                         TE.TEIdle(myDoc.data)
  579.                     END
  580.  
  581.             ELSE    (* Ignore Other Event Types *)
  582.             END
  583.         END
  584.     END Loop;
  585.  
  586. (***************************************************************)
  587. (* Initalize all menus, variables etc  *)
  588.  
  589.     PROCEDURE InitMac;
  590.     VAR
  591.         systemversion : LONGINT;
  592.     BEGIN
  593.         ME.MaxApplZone;
  594.         ME.MoreMasters;
  595.  
  596.         IM.InitGraf(IM.QuickDraw.thePort);    (* The QuickDraw Globals are proper Oberon Variables *)
  597.         TE.InitFonts;
  598.         TB.InitWindows;
  599.         TB.InitMenus;
  600.         TE.TEInit;
  601.         TB.InitDialogs(NIL);
  602.         IM.InitCursor;
  603.         SYSTEM.PUTREG(0, 0FFFF0000H);    (* everyEvent *)
  604.         TB.FlushEvents;
  605.  
  606.         SYSTEM.PUTREG(0, 73797376H);    (* gestaltSystemVersion : sysv , check for system 7 *)
  607.         MO.Gestalt;
  608.         SYSTEM.GETREG(8, systemversion);
  609.         IF systemversion < 0700H THEN
  610.             MT.SysBeep(1);
  611.             MP.ExitToShell
  612.         END;
  613.     
  614.         TB.SetMenuBar(TB.GetNewMBar(128));    (* Set up menus *)
  615.         TB.AddResMenu(TB.GetMHandle(mApple), 44525652H);
  616.         TB.AddResMenu(TB.GetMHandle(mFont), 464F4E54H);
  617.         TB.DrawMenuBar;
  618.  
  619.         SYSTEM.PUTREG(0, 120);    (* Set up print structure *)
  620.         ME.NewHandle;
  621.         SYSTEM.GETREG(8, gPrint);
  622.         IM.PrOpen;
  623.         IM.PrintDefault(gPrint);
  624.         IM.PrClose
  625.     END InitMac;
  626.  
  627. BEGIN
  628.     InitMac;
  629.     Loop()
  630. END SampleApp.
  631.